package com.demo.java.OD101_150.OD112;

import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【用连续自然数之和来表达整数】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145697250
 */
public class OdMain {
    /**
     * 该方法用于寻找输入数 `inputNum` 的所有连续自然数之和
     * 使得这些自然数的和等于 `inputNum`。
     * 比如：对于输入 15，输出：15 = 1 + 2 + 3 + 4 + 5
     * 说明：找出所有满足 1 <= x <= inputNum/2 的连续自然数序列，使得其和等于 inputNum
     *
     * @param inputNum 目标数
     */
    public static void solve(int inputNum) {
        int count = 0;  // 记录符合条件的分解方法数量
        // 遍历从 1 到 inputNum/2 的所有整数，x 表示序列的起始长度
        for (int x = 1; x <= inputNum / 2; x++) {
            // 判断是否能拆分成连续自然数之和，且起始值必须是正整数
            if (2 * inputNum % x == 0 && (2 * inputNum / x - x + 1) % 2 == 0) {
                int startValue = (2 * inputNum / x - x + 1) / 2;  // 计算起始值
                if (startValue > 0) {  // 如果起始值为正数
                    // 输出结果
                    System.out.print(inputNum + "=");
                    count++;  // 符合条件的解法数量增加
                    // 输出连续自然数序列
                    for (int i = 0; i < x; i++) {
                        if (i == x - 1) {
                            System.out.print(startValue++);
                        } else {
                            System.out.print(startValue++ + "+");
                        }
                    }
                    System.out.println();  // 输出完一组后换行
                }
            }
        }
        // 输出符合条件的分解方法的数量
        System.out.println("Result:" + count);
    }

    public static void main(String[] args) {
        try {
            Scanner scan = new Scanner(System.in);
            int inputNum = scan.nextInt();  // 输入目标数
            // 输入范围检查
            if (inputNum < 1 || inputNum > 1000) {
                System.out.println("Result:0");
                return;
            }
            solve(inputNum);  // 调用 solve 方法进行处理
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("input error");
        }
    }
}